home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
TURB_VIS
/
TCYBER25
/
CYGAME.ZIP
/
GAMEDLG.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1994-10-20
|
23KB
|
201 lines
{
Turbo Vision CyberTools 2.5
(C) 1994 Steve Goldsmith
All Rights Reserved
}
UNIT GAMEDLG ;{$I APP.INC} INTERFACE USES DOS , OBJECTS , APP , VIEWS , DIALOGS , DRIVERS , COLORSEL , VGA , COMMDLGS ,
TVSTR , CGCMDS ;CONST GAMEMATLINES =7 ;GAMEINVATTR =9 ;GAMEUFOATTR =10 ;TYPE GAMEMATRIX =ARRAY [ 0 .. GAMEMATLINES ]
OF LONGINT ;PBACKVIEW =^TBACKVIEW ;TBACKVIEW =OBJECT (TVIEW)PROCEDURE DRAW ;VIRTUAL;END ;PSPRITEVIEW =^TSPRITEVIEW ;
TSPRITEVIEW =OBJECT (TVIEW)FRAMESIZE , FRAMEPOS , ENDPOS , PALINDEX :BYTE ;DIR :TPOINT ;SPRITESTR :PSTRING ;
CONSTRUCTOR INIT (VAR BOUNDS :TRECT ;S :PSTRING ;D :TPOINT );PROCEDURE CALCMOVE ;VIRTUAL;PROCEDURE DRAW ;VIRTUAL;END ;
PUFOVIEW =^TUFOVIEW ;TUFOVIEW =OBJECT (TSPRITEVIEW)PROCEDURE CALCMOVE ;VIRTUAL;END ;PBOMBVIEW =^TBOMBVIEW ;
TBOMBVIEW =OBJECT (TSPRITEVIEW)PROCEDURE CALCMOVE ;VIRTUAL;END ;PEXPVIEW =^TEXPVIEW ;
TEXPVIEW =OBJECT (TSPRITEVIEW)PROCEDURE CALCMOVE ;VIRTUAL;END ;PSHIPVIEW =^TSHIPVIEW ;
TSHIPVIEW =OBJECT (TSPRITEVIEW)PROCEDURE CALCMOVE ;VIRTUAL;END ;PSHOTVIEW =^TSHOTVIEW ;
TSHOTVIEW =OBJECT (TSPRITEVIEW)PROCEDURE CALCMOVE ;VIRTUAL;END ;PHEADVIEW =^THEADVIEW ;
THEADVIEW =OBJECT (TSPRITEVIEW)DELAY , DELAYVAL :WORD ;PROCEDURE CALCMOVE ;VIRTUAL;END ;FREQTABLEPTR =^FREQTABLE ;
FREQTABLE =ARRAY [ 0 .. 8191 ] OF WORD ;PGAMEDLG =^TGAMEDLG ;TGAMEDLG =OBJECT (TDIALOG)CURCH , LEFTCH , RIGHTCH ,
SHOOTCH , STOPCH :CHAR ;CURSNDSEQ , ENDSNDSEQ , GAMESTATE , INVADERCNT , INVADERPTS , UFOBOMB :WORD ;LEVEL , SHIPCNT ,
LASTTIMER , SCORE :LONGINT ;FREQDATA :FREQTABLEPTR ;UFO :PUFOVIEW ;BOMB :PBOMBVIEW ;EXP :PEXPVIEW ;SHIP :PSHIPVIEW ;
SHOT :PSHOTVIEW ;HEAD :PHEADVIEW ;ANIGROUP :PGROUP ;SCORELINE , SHIPSLINE , LEVELLINE :PINPUTLINE ;CONSTRUCTOR INIT
(T :STRING ;LC ,RC,SC,PC:CHAR );DESTRUCTOR DONE ;VIRTUAL;PROCEDURE SETSTATE (ASTATE :WORD ;ENABLE :BOOLEAN );VIRTUAL;
FUNCTION GETPALETTE :PPALETTE ;VIRTUAL;PROCEDURE HANDLEEVENT (VAR EVENT :TEVENT );VIRTUAL;PROCEDURE SOUNDOFF ;
PROCEDURE SETSOUND (SNDARR :POINTER ;E :WORD );PROCEDURE PLAYSOUND ;PROCEDURE NEXTLEVEL ;PROCEDURE DISPSCORE ;
PROCEDURE DISPLEVEL ;PROCEDURE DISPSHIPS ;PROCEDURE INVADERHIT (P :PSPRITEVIEW );PROCEDURE MATRIXINVADERS
(X1 ,Y1,D:INTEGER ;MAT :GAMEMATRIX );PROCEDURE DRAWINVADERS ;PROCEDURE DELETEINVADERS ;PROCEDURE INITUFO ;
PROCEDURE DRAWUFO ;PROCEDURE INITSHIP ;PROCEDURE DRAWSHIP ;PROCEDURE INITSPRITES ;PROCEDURE DRAWSPRITES ;END ;
GAMEOPTSDATA =RECORD LEFT , RIGHT , SHOOT , STOP :STRING [ 1 ] ;SOUNDFLAG :INTEGER END ;PGAMEOPTSDLG =^TGAMEOPTSDLG ;
TGAMEOPTSDLG =OBJECT (TDIALOG)CONSTRUCTOR INIT ;END ;CONST GAMEANIMATE =$0001 ;GAMESHIPHIT =$0002 ;GAMEINVADERHIT =$0004
;GAMEPLAYSOUND =$0100 ;GAMESOUNDON =$0200 ;GAMEENDROUND =$1000 ;GAMEENDGAME =$2000 ;
CANICOLOR =#$00#$00#$00#$00#$00#$00#$00;CANIPAL =#136#137#138#139#140#141#142;CGRAPHCOLOR =#$00;CGRAPHPAL =#143;
GAMEINVADER :STRING [ 12 ] =#1#2#255+ #3#4#5+ #6#7#8+ #9#10#11;GAMEUFO :STRING [ 6 ] =#12#13#255+ #14#15#16;
GAMEBOMB :STRING [ 4 ] =#17#18#19#20;GAMEEXP :STRING [ 18 ]
=#21#21#21#21#22#22#22#22#23#23#23#23#22#22#22#22#21#21#21#21;GAMESHIP :STRING [ 12 ] =#24#25#255+ #26#27#28+ #29#30#31+
#32#33#34;GAMESHOT :STRING [ 4 ] =#35#36#37#38;GAMEHEAD :STRING [ 140 ] =#255#64#65#66#67+ #68#69#70#70#72+
#73#74#75#76#77+ #78#79#80#81#82+ #255#83#84#85#86+ #255#87#88#89#90+ #255#91#92#93#94+ #255#95#96#97#98+
#255#99#100#101#102+ #255#103#104#105#106+ #255#107#108#109#110+ #255#111#112#113#114+ #255#115#116#117#118+
#255#119#120#121#122+ #255#123#124#125#126+ #255#127#128#129#255+ #255#130#131#132#133+ #255#134#135#136#137+
#255#138#139#140#141+ #255#142#143#144#255+ #255#145#146#147#148+ #255#149#150#151#152+ #255#153#154#155#156+
#255#157#158#159#255+ #255#160#161#162#255+ #255#163#164#165#166+ #255#167#168#169#170+ #255#171#172#173#255;
GAMEMATBLOCK1 :GAMEMATRIX =($ffff0000 , $ffff0000 , $ffff0000 , $ffff0000 , $00000000 , $00000000 , $00000000 , $00000000
);GAMEMATBLOCK2 :GAMEMATRIX =($00000000 , $fff00000 , $00000000 , $fff00000 , $00000000 , $fff00000 , $00000000 ,
$00000000 );GAMEMATBLOCK3 :GAMEMATRIX =($fff00000 , $00000000 , $fff00000 , $00000000 , $fff00000 , $00000000 , $00000000
, $00000000 );GAMEMATBLOCK4 :GAMEMATRIX =($ffff0000 , $ffff0000 , $ffff0000 , $ffff0000 , $ffff0000 , $ffff0000 ,
$ffff0000 , $ffff0000 );GAMEMATBLOCK5 :GAMEMATRIX =($00000000 , $ffff0000 , $00000000 , $ffff0000 , $00000000 , $ffff0000
, $00000000 , $ffff0000 );GAMEMATBLOCK6 :GAMEMATRIX =($fffff000 , $00000000 , $fffff000 , $00000000 , $fffff000 ,
$00000000 , $fffff000 , $00000000 );GAMEINVCOLOR :ARRAY [ 0 .. 6 ] OF ARRAY [ 0 .. VGARGBMAX ] OF BYTE =((0 , 63 , 0 ),
(0 , 0 , 63 ), (63 , 0 , 0 ), (0 , 47 , 47 ), (63 , 63 , 0 ), (31 , 63 , 0 ), (15 , 63 , 15 ));SNDSHOT :ARRAY [ 0 .. 1 ]
OF WORD =($4000 , $3000 );SNDINVADER :ARRAY [ 0 .. 2 ] OF WORD =($0800 , $1000 , $2000 );SNDUFO :ARRAY [ 0 .. 8 ]
OF WORD =($1100 , $1200 , $1100 , $1300 , $1200 , $1400 , $1300 , $1500 , $1400 );SNDSHIP :ARRAY [ 0 .. 8 ]
OF WORD =($1000 , $2000 , $3000 , $4000 , $5000 , $6000 , $7000 , $8000 , $9000 );
IMPLEMENTATION PROCEDURE TBACKVIEW.DRAW ;VAR OI1OllllOl1:TDRAWBUFFER;BEGIN MOVECHAR (OI1OllllOl1 [ 0 ] , ' ', GETCOLOR
(33 ), SIZE.X );WRITELINE (0 , 0 , SIZE.X , SIZE.Y , OI1OllllOl1 )END ;CONSTRUCTOR TSPRITEVIEW.INIT (VAR BOUNDS:TRECT;
S:PSTRING;D:TPOINT);BEGIN INHERITED INIT(BOUNDS );SPRITESTR := S ;DIR := D ;FRAMESIZE := SIZE.X * SIZE.Y ;FRAMEPOS := 1 ;
ENDPOS := LENGTH (SPRITESTR ^)- FRAMESIZE + 1 END ;PROCEDURE TSPRITEVIEW.CALCMOVE ;BEGIN IF DIR.X > 0 THEN BEGIN IF
FRAMEPOS < ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE BEGIN ORIGIN.X := ORIGIN.X + DIR.X ;FRAMEPOS := 1 END END ELSE IF
DIR.X < 0 THEN BEGIN IF FRAMEPOS > 1 THEN DEC (FRAMEPOS , FRAMESIZE )ELSE BEGIN ORIGIN.X := ORIGIN.X + DIR.X ;FRAMEPOS :=
ENDPOS END END ;IF ORIGIN.X > OWNER ^. SIZE.X THEN BEGIN FRAMEPOS := ENDPOS ;ORIGIN.X := OWNER ^. SIZE.X ;DIR.X := - 1 ;
INC (ORIGIN.Y );IF ORIGIN.Y > OWNER ^. SIZE.Y THEN ORIGIN.Y := 0 END ELSE IF ORIGIN.X < - SIZE.X THEN BEGIN FRAMEPOS := 1
;ORIGIN.X := - SIZE.X ;DIR.X := 1 ;INC (ORIGIN.Y );IF ORIGIN.Y > OWNER ^. SIZE.Y THEN ORIGIN.Y := 0 END END ;
PROCEDURE TSPRITEVIEW.DRAW ;VAR OI1OllllOl1:TDRAWBUFFER;OOIO,OOIl:BYTE;BEGIN FOR OOIl := 0 TO SIZE.Y - 1
DO BEGIN FOR OOIO := 0 TO SIZE.X - 1 DO MOVECHAR (OI1OllllOl1 [ OOIO ] , SPRITESTR ^[ OOIl * SIZE.X + OOIO + FRAMEPOS ]
, GETCOLOR (PALINDEX ), 1 );WRITELINE (0 , OOIl , SIZE.X , 1 , OI1OllllOl1 )END END ;PROCEDURE TUFOVIEW.CALCMOVE ;
BEGIN IF DIR.X > 0 THEN BEGIN IF FRAMEPOS < ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE BEGIN ORIGIN.X := ORIGIN.X +
DIR.X ;FRAMEPOS := 1 END END ELSE IF DIR.X < 0 THEN BEGIN IF FRAMEPOS > 1 THEN DEC (FRAMEPOS , FRAMESIZE )ELSE
BEGIN ORIGIN.X := ORIGIN.X + DIR.X ;FRAMEPOS := ENDPOS END END ;IF ORIGIN.X > OWNER ^. SIZE.X THEN BEGIN FRAMEPOS :=
ENDPOS ;ORIGIN.X := OWNER ^. SIZE.X ;DIR.X := - 1 ;ORIGIN.Y := RANDOM (OWNER ^. SIZE.Y - 4 )END ELSE IF ORIGIN.X < -
SIZE.X THEN BEGIN FRAMEPOS := 1 ;ORIGIN.X := - SIZE.X ;DIR.X := 1 ;ORIGIN.Y := RANDOM (OWNER ^. SIZE.Y - 4 )END END ;
PROCEDURE TBOMBVIEW.CALCMOVE ;BEGIN IF STATE AND SFVISIBLE =SFVISIBLE THEN BEGIN IF FRAMEPOS < ENDPOS THEN INC (FRAMEPOS
, FRAMESIZE )ELSE BEGIN ORIGIN.Y := ORIGIN.Y + DIR.Y ;FRAMEPOS := 1 END END END ;PROCEDURE TEXPVIEW.CALCMOVE ;BEGIN IF
STATE AND SFVISIBLE =SFVISIBLE THEN BEGIN IF FRAMEPOS < ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE HIDE END END ;
PROCEDURE TSHIPVIEW.CALCMOVE ;BEGIN IF STATE AND SFVISIBLE =SFVISIBLE THEN BEGIN IF (ORIGIN.X < OWNER ^. SIZE.X - 1 )AND
(DIR.X > 0 )THEN BEGIN IF FRAMEPOS < ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE BEGIN ORIGIN.X := ORIGIN.X + DIR.X ;
FRAMEPOS := 1 END END ;IF (ORIGIN.X >= 0 )AND (DIR.X < 0 )THEN BEGIN IF FRAMEPOS > 1 THEN DEC (FRAMEPOS , FRAMESIZE )ELSE
BEGIN ORIGIN.X := ORIGIN.X + DIR.X ;FRAMEPOS := ENDPOS END END END END ;PROCEDURE TSHOTVIEW.CALCMOVE ;BEGIN IF FRAMEPOS <
ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE BEGIN ORIGIN.Y := ORIGIN.Y + DIR.Y ;FRAMEPOS := 1 END ;IF ORIGIN.Y < 0 THEN
HIDE END ;PROCEDURE THEADVIEW.CALCMOVE ;BEGIN IF STATE AND SFVISIBLE =SFVISIBLE THEN BEGIN DEC (DELAY );IF DELAY =0 THEN
BEGIN IF FRAMEPOS < ENDPOS THEN INC (FRAMEPOS , FRAMESIZE )ELSE HIDE ;DELAY := DELAYVAL END END END ;
CONSTRUCTOR TGAMEDLG.INIT (T:STRING ;LC,RC,SC,PC:CHAR);VAR OO1I:TRECT;O10lI1l00O:PBACKVIEW;BEGIN OO1I.ASSIGN (0 , 0 , 75
, 20 );INHERITED INIT(OO1I , T );OPTIONS := OPTIONS OR OFCENTERED ;PALETTE := DPBLUEDIALOG ;GAMESTATE := GAMESTATE OR
GAMEANIMATE ;SHIPCNT := 5 ;INVADERCNT := 0 ;CURSNDSEQ := 0 ;ENDSNDSEQ := 0 ;FREQDATA := NIL ;LASTTIMER := LONGINT (PTR
(SEG0040 , $6c )^);LEFTCH := UPCASE (LC );RIGHTCH := UPCASE (RC );SHOOTCH := UPCASE (SC );STOPCH := UPCASE (PC );
OO1I.ASSIGN (63 , 3 , 73 , 4 );SCORELINE := NEW (PINPUTLINE , INIT (OO1I , 8 ));SCORELINE ^. OPTIONS := SCORELINE ^.
OPTIONS AND NOT OFSELECTABLE ;INSERT (SCORELINE );DISPSCORE ;OO1I.ASSIGN (62 , 2 , 68 , 3 );INSERT (NEW (PLABEL , INIT
(OO1I , 'Score', NIL )));OO1I.ASSIGN (63 , 5 , 73 , 6 );LEVELLINE := NEW (PINPUTLINE , INIT (OO1I , 8 ));LEVELLINE ^.
OPTIONS := SCORELINE ^. OPTIONS AND NOT OFSELECTABLE ;INSERT (LEVELLINE );DISPLEVEL ;OO1I.ASSIGN (62 , 4 , 68 , 5 );
INSERT (NEW (PLABEL , INIT (OO1I , 'Level', NIL )));OO1I.ASSIGN (63 , 7 , 73 , 8 );SHIPSLINE := NEW (PINPUTLINE , INIT
(OO1I , 8 ));SHIPSLINE ^. OPTIONS := SCORELINE ^. OPTIONS AND NOT OFSELECTABLE ;INSERT (SHIPSLINE );DISPSHIPS ;
OO1I.ASSIGN (62 , 6 , 68 , 7 );INSERT (NEW (PLABEL , INIT (OO1I , 'Ships', NIL )));OO1I.ASSIGN (62 , 15 , 73 , 17 );
INSERT (NEW (PBUTTON , INIT (OO1I , '~P~lay', CMANION , BFNORMAL )));OO1I.ASSIGN (62 , 17 , 73 , 19 );INSERT (NEW
(PBUTTON , INIT (OO1I , '~S~top', CMANIOFF , BFNORMAL )));OO1I.ASSIGN (2 , 1 , 62 , 19 );ANIGROUP := NEW (PGROUP , INIT
(OO1I ));ANIGROUP ^. GETEXTENT (OO1I );O10lI1l00O := NEW (PBACKVIEW , INIT (OO1I ));ANIGROUP ^. INSERT (O10lI1l00O );
INITSPRITES ;INSERT (ANIGROUP )END ;DESTRUCTOR TGAMEDLG.DONE ;BEGIN SOUNDOFF ;INHERITED DONE END ;
PROCEDURE TGAMEDLG.SETSTATE (ASTATE:WORD;ENABLE:BOOLEAN);BEGIN INHERITED SETSTATE(ASTATE , ENABLE );IF ASTATE =SFFOCUSED
THEN BEGIN IF LEVEL < 8 THEN BEGIN SOUNDOFF ;SETDAC (GETATTRCONT (GAMEINVATTR ), GAMEINVCOLOR [ LEVEL - 1 , 0 ] ,
GAMEINVCOLOR [ LEVEL - 1 , 1 ] , GAMEINVCOLOR [ LEVEL - 1 , 2 ] );SETDAC (GETATTRCONT (GAMEUFOATTR ), GAMEINVCOLOR [
LEVEL - 1 , 0 ] , GAMEINVCOLOR [ LEVEL - 1 , 1 ] , GAMEINVCOLOR [ LEVEL - 1 , 2 ] );FONTMAPSELECT (VGACHRTABLEMAP1 [ 0 ]
, VGACHRTABLEMAP2 [ LEVEL ] )END ELSE BEGIN SOUNDOFF ;FONTMAPSELECT (VGACHRTABLEMAP1 [ 0 ] , VGACHRTABLEMAP2 [ RANDOM (7
)+ 1 ] )END END END ;FUNCTION TGAMEDLG.GETPALETTE :PPALETTE ;CONST OOlOIOI1Oll1=CBLUEDIALOG+ CANIPAL;
O10O1I10lIIO0=CCYANDIALOG+ CANIPAL;OIO1IO1ll10=CGRAYDIALOG+ CANIPAL;OO10:ARRAY [ DPBLUEDIALOG.. DPGRAYDIALOG] OF STRING
[ LENGTH(OOlOIOI1Oll1)] =(OOlOIOI1Oll1, O10O1I10lIIO0, OIO1IO1ll10);BEGIN GETPALETTE := @ OO10 [ PALETTE ] ;END ;
PROCEDURE TGAMEDLG.HANDLEEVENT (VAR EVENT:TEVENT);PROCEDURE O100Ol011O ;BEGIN IF SHOT ^. STATE AND SFVISIBLE =0 THEN
BEGIN SETSOUND (@ SNDSHOT , 1 );SHOT ^. ORIGIN.X := SHIP ^. ORIGIN.X ;IF SHIP ^. FRAMEPOS > 6 THEN INC (SHOT ^. ORIGIN.X
);SHOT ^. ORIGIN.Y := SHIP ^. ORIGIN.Y - 1 ;SHOT ^. FRAMEPOS := 1 ;SHOT ^. SHOW END END ;PROCEDURE OIIIO01I0 ;
VAR OOO0IlO0OI1O:STRING [ 8 ] ;BEGIN SETSOUND (@ SNDSHIP , 8 );GAMESTATE := GAMESTATE AND NOT GAMESHIPHIT ;SHIP ^. HIDE ;
DEC (SHIPCNT );DISPSHIPS ;WITH HEAD^ DO BEGIN FRAMEPOS := 1 ;ORIGIN.X := SHIP ^. ORIGIN.X - 2 ;ORIGIN.Y := SHIP ^.
ORIGIN.Y - 3 ;SHOW END ;DEC (LEVEL );NEXTLEVEL ;IF SHIPCNT =0 THEN BEGIN GAMESTATE := (GAMESTATE AND NOT GAMEANIMATE )OR
GAMEENDGAME ;OOO0IlO0OI1O := 'GAME END';SHIPSLINE ^. SETDATA (OOO0IlO0OI1O );SOUNDOFF END END ;
BEGIN INHERITED HANDLEEVENT(EVENT );CASE EVENT.WHAT OF EVKEYDOWN :IF (GAMESTATE AND GAMEANIMATE <> 0 )AND (STATE AND
SFFOCUSED <> 0 )AND (SHIP ^. STATE AND SFVISIBLE <> 0 )THEN BEGIN CURCH := UPCASE (EVENT.CHARCODE );IF CURCH =LEFTCH THEN
SHIP ^. DIR.X := - 1 ELSE IF CURCH =RIGHTCH THEN SHIP ^. DIR.X := 1 ELSE IF CURCH =STOPCH THEN SHIP ^. DIR.X := 0 ELSE IF
CURCH =SHOOTCH THEN O100Ol011O ELSE EXIT ;CLEAREVENT (EVENT )END ;EVCOMMAND :BEGIN CASE EVENT.COMMAND OF CMANIOFF
:BEGIN GAMESTATE := GAMESTATE AND NOT GAMEANIMATE ;SOUNDOFF END ;CMANION :GAMESTATE := GAMESTATE OR GAMEANIMATE ELSE EXIT
END ;CLEAREVENT (EVENT )END ;EVBROADCAST :IF (GAMESTATE AND GAMEANIMATE <> 0 )AND (GAMESTATE AND GAMEENDGAME =0 )AND
(STATE AND SFFOCUSED <> 0 )THEN BEGIN CASE EVENT.COMMAND OF CMANIMATE :BEGIN PLAYSOUND ;DRAWSPRITES ;IF GAMESTATE AND
GAMEINVADERHIT <> 0 THEN BEGIN GAMESTATE := GAMESTATE AND NOT GAMEINVADERHIT ;DISPSCORE END ;IF GAMESTATE AND GAMESHIPHIT
<> 0 THEN OIIIO01I0 ;IF GAMESTATE AND GAMEENDROUND <> 0 THEN NEXTLEVEL END END END END END ;PROCEDURE TGAMEDLG.SOUNDOFF ;
BEGIN IF GAMESTATE AND GAMESOUNDON <> 0 THEN ASM {} IN AL , 61h {} AND AL , 11111100B{} OUT 61h , AL {} END END ;
PROCEDURE TGAMEDLG.SETSOUND (SNDARR:POINTER;E:WORD);BEGIN IF (GAMESTATE AND GAMESOUNDON <> 0 )AND (GAMESTATE AND
GAMEPLAYSOUND =0 )THEN BEGIN CURSNDSEQ := 0 ;ENDSNDSEQ := E ;FREQDATA := SNDARR ;GAMESTATE := GAMESTATE OR GAMEPLAYSOUND
END END ;PROCEDURE TGAMEDLG.PLAYSOUND ;VAR OI1II1O1OO0l:WORD;BEGIN IF (GAMESTATE AND GAMESOUNDON <> 0 )AND (GAMESTATE AND
GAMEPLAYSOUND <> 0 )AND (LONGINT (PTR (SEG0040 , $6c )^)<> LASTTIMER )THEN BEGIN IF CURSNDSEQ <= ENDSNDSEQ THEN
BEGIN LASTTIMER := LONGINT (PTR (SEG0040 , $6c )^);OI1II1O1OO0l := FREQDATA ^[ CURSNDSEQ ] ;ASM {} MOV AL , 10110110B{}
OUT 43h , AL {} MOV AX , OI1II1O1OO0l{} OUT 42h , AL {} MOV AL , AH {} OUT 42h , AL {} IN AL , 61h {}
OR AL , 00000011B{} OUT 61h , AL {} END;INC (CURSNDSEQ )END ELSE BEGIN SOUNDOFF ;GAMESTATE := GAMESTATE AND NOT
GAMEPLAYSOUND END END END ;PROCEDURE TGAMEDLG.NEXTLEVEL ;BEGIN GAMESTATE := GAMESTATE AND NOT GAMEENDROUND ;INC (LEVEL );
DISPLEVEL ;DELETEINVADERS ;IF LEVEL < 8 THEN BEGIN SETDAC (GETATTRCONT (GAMEINVATTR ), GAMEINVCOLOR [ LEVEL - 1 , 0 ] ,
GAMEINVCOLOR [ LEVEL - 1 , 1 ] , GAMEINVCOLOR [ LEVEL - 1 , 2 ] );SETDAC (GETATTRCONT (GAMEUFOATTR ), GAMEINVCOLOR [
LEVEL - 1 , 0 ] , GAMEINVCOLOR [ LEVEL - 1 , 1 ] , GAMEINVCOLOR [ LEVEL - 1 , 2 ] );FONTMAPSELECT (VGACHRTABLEMAP1 [ 0 ]
, VGACHRTABLEMAP2 [ LEVEL ] )END ;CASE LEVEL OF 1 :BEGIN MATRIXINVADERS (10 , 1 , 1 , GAMEMATBLOCK1 );INVADERPTS := 100
;UFOBOMB := 20 END ;2 :BEGIN MATRIXINVADERS (10 , 3 , 1 , GAMEMATBLOCK1 );INVADERPTS := 100 ;UFOBOMB := 15 END ;3
:BEGIN MATRIXINVADERS (10 , 1 , 1 , GAMEMATBLOCK2 );MATRIXINVADERS (10 , 1 , - 1 , GAMEMATBLOCK3 );INVADERPTS := 200 ;
UFOBOMB := 10 END ;4 :BEGIN MATRIXINVADERS (10 , 2 , 1 , GAMEMATBLOCK2 );MATRIXINVADERS (10 , 2 , - 1 , GAMEMATBLOCK3 );
INVADERPTS := 200 ;UFOBOMB := 8 END ;5 :BEGIN MATRIXINVADERS (8 , - 2 , 1 , GAMEMATBLOCK4 );INVADERPTS := 300 ;UFOBOMB :=
7 END ;6 :BEGIN MATRIXINVADERS (8 , 0 , 1 , GAMEMATBLOCK4 );INVADERPTS := 300 ;UFOBOMB := 5 END ;7 :BEGIN MATRIXINVADERS
(0 , 0 , 1 , GAMEMATBLOCK5 );MATRIXINVADERS (0 , 0 , - 1 , GAMEMATBLOCK6 );INVADERPTS := 400 ;UFOBOMB := 2 END ELSE
BEGIN FONTMAPSELECT (VGACHRTABLEMAP1 [ 0 ] , VGACHRTABLEMAP2 [ RANDOM (7 )+ 1 ] );MATRIXINVADERS (0 , 0 , 1 ,
GAMEMATBLOCK5 );MATRIXINVADERS (0 , 0 , - 1 , GAMEMATBLOCK6 );INVADERPTS := 500 ;UFOBOMB := 0 END END END ;
PROCEDURE TGAMEDLG.DISPSCORE ;VAR OOO0IlO0OI1O:STRING [ 8 ] ;BEGIN FORMATSTR (OOO0IlO0OI1O , '%0#%08d', SCORE );
SCORELINE ^. SETDATA (OOO0IlO0OI1O )END ;PROCEDURE TGAMEDLG.DISPLEVEL ;VAR OOO0IlO0OI1O:STRING [ 8 ] ;BEGIN FORMATSTR
(OOO0IlO0OI1O , '%0#%8d', LEVEL );LEVELLINE ^. SETDATA (OOO0IlO0OI1O )END ;PROCEDURE TGAMEDLG.DISPSHIPS ;
VAR OOO0IlO0OI1O:STRING [ 8 ] ;BEGIN FORMATSTR (OOO0IlO0OI1O , '%0#%8d', SHIPCNT );SHIPSLINE ^. SETDATA (OOO0IlO0OI1O
)END ;PROCEDURE TGAMEDLG.INVADERHIT (P:PSPRITEVIEW);BEGIN SETSOUND (@ SNDINVADER , 2 );P ^. HIDE ;DEC (INVADERCNT );IF
INVADERCNT =0 THEN GAMESTATE := GAMESTATE OR GAMEENDROUND ;GAMESTATE := GAMESTATE OR GAMEINVADERHIT END ;
PROCEDURE TGAMEDLG.MATRIXINVADERS (X1,Y1,D:INTEGER;MAT:GAMEMATRIX);VAR OOIO,OOIl:INTEGER;O10OIIllIl00l:LONGINT;
OIO1,OO1I:TRECT;OO10:TPOINT;O1I01Oll:PSPRITEVIEW;BEGIN ANIGROUP ^. GETBOUNDS (OIO1 );OO10.X := D ;OO10.Y := 0 ;FOR OOIl
:= 0 TO GAMEMATLINES DO BEGIN O10OIIllIl00l := $8000000 ;FOR OOIO := 0 TO 31 DO BEGIN IF MAT [ OOIl ] AND O10OIIllIl00l
<> 0 THEN BEGIN OO1I.ASSIGN (OOIO * 3 + X1 + OIO1.A.X , OOIl * 2 + Y1 + OIO1.A.Y , OOIO * 3 + X1 + OIO1.A.X + 3 , OOIl *
2 + Y1 + OIO1.A.Y + 1 );O1I01Oll := NEW (PSPRITEVIEW , INIT (OO1I , @ GAMEINVADER , OO10 ));O1I01Oll ^. PALINDEX := 34 ;
ANIGROUP ^. INSERT (O1I01Oll );INC (INVADERCNT )END ;IF OOIO <> 31 THEN O10OIIllIl00l := O10OIIllIl00l SHR 1 END END END
;PROCEDURE TGAMEDLG.DRAWINVADERS ;PROCEDURE OOIl10OO111l (OO10:PSPRITEVIEW);FAR ;BEGIN IF TYPEOF (OO10 ^)=TYPEOF
(TSPRITEVIEW )THEN BEGIN OO10 ^. CALCMOVE ;OO10 ^. DRAWVIEW ;IF (OO10 ^. STATE AND SFVISIBLE <> 0 )THEN BEGIN IF (SHIP ^.
STATE AND SFVISIBLE <> 0 )AND (OO10 ^. ORIGIN.Y =SHIP ^. ORIGIN.Y )AND (OO10 ^. ORIGIN.X =SHIP ^. ORIGIN.X )THEN
BEGIN INVADERHIT (OO10 );GAMESTATE := GAMESTATE OR GAMESHIPHIT END ;IF (SHOT ^. STATE AND SFVISIBLE <> 0 )AND (OO10 ^.
ORIGIN.Y =SHOT ^. ORIGIN.Y )AND (((SHOT ^. ORIGIN.X =OO10 ^. ORIGIN.X )OR (SHOT ^. ORIGIN.X =OO10 ^. ORIGIN.X + 1 )OR
(SHOT ^. ORIGIN.X =OO10 ^. ORIGIN.X + 2 )))THEN BEGIN SHOT ^. HIDE ;SCORE := SCORE + INVADERPTS ;INVADERHIT (OO10 )END
END END END ;BEGIN ANIGROUP ^. FOREACH (@ OOIl10OO111l )END ;PROCEDURE TGAMEDLG.DELETEINVADERS ;PROCEDURE OOIlI1O1l01l
(OO10:PSPRITEVIEW);FAR ;BEGIN IF TYPEOF (OO10 ^)=TYPEOF (TSPRITEVIEW )THEN DISPOSE (OO10 , DONE );INVADERCNT := 0 END ;
BEGIN ANIGROUP ^. FOREACH (@ OOIlI1O1l01l )END ;PROCEDURE TGAMEDLG.INITUFO ;VAR OO1I:TRECT;OO10:TPOINT;BEGIN OO10.X := 0
;OO10.Y := 1 ;OO1I.ASSIGN (0 , 0 , 1 , 1 );BOMB := NEW (PBOMBVIEW , INIT (OO1I , @ GAMEBOMB , OO10 ));BOMB ^. PALINDEX :=
36 ;BOMB ^. HIDE ;ANIGROUP ^. INSERT (BOMB );OO10.X := 0 ;OO10.Y := 0 ;EXP := NEW (PEXPVIEW , INIT (OO1I , @ GAMEEXP ,
OO10 ));EXP ^. PALINDEX := 37 ;EXP ^. HIDE ;ANIGROUP ^. INSERT (EXP );OO10.X := 1 ;OO10.Y := 0 ;OO1I.ASSIGN (0 , 0 , 3 ,
1 );UFO := NEW (PUFOVIEW , INIT (OO1I , @ GAMEUFO , OO10 ));UFO ^. PALINDEX := 35 ;ANIGROUP ^. INSERT (UFO )END ;
PROCEDURE TGAMEDLG.DRAWUFO ;BEGIN IF (BOMB ^. STATE AND SFVISIBLE =0 )AND (UFO ^. ORIGIN.X =SHIP ^. ORIGIN.X )AND (RANDOM
(UFOBOMB )=0 )THEN BEGIN BOMB ^. ORIGIN.X := UFO ^. ORIGIN.X ;BOMB ^. ORIGIN.Y := UFO ^. ORIGIN.Y ;BOMB ^. SHOW END ;IF
(BOMB ^. STATE AND SFVISIBLE =SFVISIBLE )AND (BOMB ^. ORIGIN.Y =ANIGROUP ^. SIZE.Y )THEN BEGIN EXP ^. ORIGIN.X := BOMB ^.
ORIGIN.X ;EXP ^. ORIGIN.Y := BOMB ^. ORIGIN.Y - 1 ;EXP ^. FRAMEPOS := 1 ;BOMB ^. HIDE ;EXP ^. SHOW END ;UFO ^. CALCMOVE ;
BOMB ^. CALCMOVE ;EXP ^. CALCMOVE ;UFO ^. DRAWVIEW ;BOMB ^. DRAWVIEW ;EXP ^. DRAWVIEW ;IF (SHOT ^. STATE AND SFVISIBLE <>
0 )AND (SHOT ^. ORIGIN.Y =UFO ^. ORIGIN.Y )AND (((SHOT ^. ORIGIN.X =UFO ^. ORIGIN.X )OR (SHOT ^. ORIGIN.X =UFO ^.
ORIGIN.X + 1 )OR (SHOT ^. ORIGIN.X =UFO ^. ORIGIN.X + 2 )))THEN BEGIN SETSOUND (@ SNDUFO , 8 );SHOT ^. HIDE ;SCORE :=
SCORE + 500 ;DISPSCORE ;WITH UFO^ DO BEGIN FRAMEPOS := 1 ;ORIGIN.X := - SIZE.X ;DIR.X := 1 ;ORIGIN.Y := RANDOM (OWNER ^.
SIZE.Y - 4 )END END ;IF (BOMB ^. STATE AND SFVISIBLE <> 0 )AND (SHIP ^. STATE AND SFVISIBLE <> 0 )AND (BOMB ^. ORIGIN.Y
=SHIP ^. ORIGIN.Y )AND (((BOMB ^. ORIGIN.X =SHIP ^. ORIGIN.X )OR (BOMB ^. ORIGIN.X =SHIP ^. ORIGIN.X + 1 )OR (BOMB ^.
ORIGIN.X =SHIP ^. ORIGIN.X + 2 )))THEN BEGIN BOMB ^. HIDE ;GAMESTATE := GAMESTATE OR GAMESHIPHIT END ;IF (EXP ^. STATE
AND SFVISIBLE <> 0 )AND (SHIP ^. STATE AND SFVISIBLE <> 0 )AND (EXP ^. ORIGIN.Y =SHIP ^. ORIGIN.Y )AND (((EXP ^. ORIGIN.X
=SHIP ^. ORIGIN.X )OR (EXP ^. ORIGIN.X =SHIP ^. ORIGIN.X + 1 )OR (EXP ^. ORIGIN.X =SHIP ^. ORIGIN.X + 2 )))THEN BEGIN EXP
^. HIDE ;GAMESTATE := GAMESTATE OR GAMESHIPHIT END END ;PROCEDURE TGAMEDLG.INITSHIP ;VAR OIO1,OO1I:TRECT;OO10:TPOINT;
BEGIN ANIGROUP ^. GETBOUNDS (OIO1 );OO10.X := 0 ;OO10.Y := 0 ;OO1I.ASSIGN (OIO1.B.X DIV 2 - 1 , OIO1.B.Y - 2 , OIO1.B.X
DIV 2 + 2 , OIO1.B.Y - 1 );SHIP := NEW (PSHIPVIEW , INIT (OO1I , @ GAMESHIP , OO10 ));SHIP ^. PALINDEX := 38 ;ANIGROUP ^.
INSERT (SHIP );OO10.X := 0 ;OO10.Y := - 1 ;OO1I.ASSIGN (OIO1.A.X + 1 , OIO1.A.Y , OIO1.A.X + 2 , OIO1.A.Y + 1 );SHOT :=
NEW (PSHOTVIEW , INIT (OO1I , @ GAMESHOT , OO10 ));SHOT ^. PALINDEX := 39 ;SHOT ^. HIDE ;ANIGROUP ^. INSERT (SHOT );
OO1I.ASSIGN (0 , 0 , 5 , 4 );OO10.X := 0 ;OO10.Y := 0 ;HEAD := NEW (PHEADVIEW , INIT (OO1I , @ GAMEHEAD , OO10 ));HEAD ^.
PALINDEX := 38 ;HEAD ^. HIDE ;HEAD ^. DELAYVAL := 7 ;HEAD ^. DELAY := 7 ;ANIGROUP ^. INSERT (HEAD );END ;
PROCEDURE TGAMEDLG.DRAWSHIP ;BEGIN SHIP ^. CALCMOVE ;SHOT ^. CALCMOVE ;HEAD ^. CALCMOVE ;SHIP ^. DRAWVIEW ;SHOT ^.
DRAWVIEW ;HEAD ^. DRAWVIEW ;IF (HEAD ^. STATE AND SFVISIBLE =0 )AND (SHIP ^. STATE AND SFVISIBLE =0 )THEN BEGIN SHIP ^.
ORIGIN.X := ANIGROUP ^. SIZE.X DIV 2 - 1 ;SHIP ^. DIR.X := 0 ;SHIP ^. SHOW END END ;PROCEDURE TGAMEDLG.INITSPRITES ;
BEGIN INITSHIP ;INITUFO ;NEXTLEVEL END ;PROCEDURE TGAMEDLG.DRAWSPRITES ;BEGIN ANIGROUP ^. LOCK ;DRAWINVADERS ;DRAWUFO ;
DRAWSHIP ;ANIGROUP ^. LAST ^. DRAWVIEW ;ANIGROUP ^. UNLOCK END ;CONSTRUCTOR TGAMEOPTSDLG.INIT ;VAR OO1I:TRECT;
OIO1000lI0l:PINPUTLINE;O1010O1lIOl0O:PCHECKBOXESCF;BEGIN OO1I.ASSIGN (0 , 0 , 29 , 10 );INHERITED INIT(OO1I ,
'Controls');OO1I.ASSIGN (10 , 2 , 13 , 3 );OIO1000lI0l := NEW (PINPUTLINE , INIT (OO1I , 1 ));INSERT (OIO1000lI0l );
OO1I.ASSIGN (1 , 2 , 7 , 3 );INSERT (NEW (PLABEL , INIT (OO1I , '~L~eft', OIO1000lI0l )));OO1I.ASSIGN (10 , 3 , 13 , 4 );
OIO1000lI0l := NEW (PINPUTLINE , INIT (OO1I , 1 ));INSERT (OIO1000lI0l );OO1I.ASSIGN (1 , 3 , 7 , 4 );INSERT (NEW (PLABEL
, INIT (OO1I , '~R~ight', OIO1000lI0l )));OO1I.ASSIGN (10 , 4 , 13 , 5 );OIO1000lI0l := NEW (PINPUTLINE , INIT (OO1I , 1
));INSERT (OIO1000lI0l );OO1I.ASSIGN (1 , 4 , 7 , 5 );INSERT (NEW (PLABEL , INIT (OO1I , '~S~hoot', OIO1000lI0l )));
OO1I.ASSIGN (10 , 5 , 13 , 6 );OIO1000lI0l := NEW (PINPUTLINE , INIT (OO1I , 1 ));INSERT (OIO1000lI0l );OO1I.ASSIGN (1 ,
5 , 7 , 6 );INSERT (NEW (PLABEL , INIT (OO1I , 'S~t~op', OIO1000lI0l )));OO1I.ASSIGN (15 , 3 , 27 , 4 );O1010O1lIOl0O :=
NEW (PCHECKBOXESCF , INIT (OO1I , NEWSITEM ('On/Off', NIL )));INSERT (O1010O1lIOl0O );OO1I.ASSIGN (14 , 2 , 20 , 3 );
INSERT (NEW (PLABEL , INIT (OO1I , 'Soun~d~', O1010O1lIOl0O )));OO1I.ASSIGN (2 , 7 , 12 , 9 );INSERT (NEW (PBUTTON , INIT
(OO1I , 'O~K~', CMOK , BFDEFAULT )));OO1I.ASSIGN (16 , 7 , 26 , 9 );INSERT (NEW (PBUTTON , INIT (OO1I , 'Cancel',
CMCANCEL , BFNORMAL )))END ;END .